#include <stdio.h>
#include <stdlib.h>

// 
// 实参			形参
// char c[][]	char (*c)[];		// 二维数组被编译器改写成数组的指针，而不是指针的指针
// char *c[]	char **c;			// 指针数组被改写成批针的指针

// 所以函数void f(char **p)中，不能传入二维指针。 


void main()
{
	int matrix[4][3] = {{0,5,7},{0,1,8},{-1,3,4},{-6,2,9}};
	printf("二维数组:\n");
	printf("matrix:  %x\n", matrix);		// 二维数组名，常量指针
	printf("*matrix: %x\n", *matrix);		// 指向首元素
	printf("自增时的地址变化:%x --> %x\n", matrix, matrix+1);	

	printf("二维指针:\n");
	int val = 3;
	int *p1 = &val, **p2 = &p1;
	printf("p2:  %x\n", p2);
	printf("*p2: %x\n", *p2);		 
	printf("自增时的地址变化::%x --> %x\n", p2, p2+1);	
	printf("\n");
// 结论: 二维数组名表示一个常量指针, 指向首数组的地址, 所以matrix和*matrix地址相同;
// 		 二维数组是数组的数组, 在编译器中改写成数组的指针, matrix+1指向下一个数组的地址.

	printf("如果将二维数组名强转, 传递给二维指针:\n");
	p2 = (int **)matrix;
	printf("*p2:%x --> 首元素\n",*p2);
	printf("**p:%%x --> 对0解地址会报错\n");
//  不要将二维数组名强转为二维指针!!!
}